package cau.se.project.method;

import javax.swing.tree.TreeModel;

import cau.se.project.data.method.GroupControl;
import cau.se.project.data.method.RowControl;

public interface CLSXControl extends TreeModel {
	
	/**
	 * 그룹을 만든다
	 * @param newName 새 그룹의 이름
	 */
	public GroupControl 
		makeGroup(String newName);
	
	/**
	 * 그룹을 해제한다
	 * @param group 해제할 그룹
	 */
	public void
		unGroup(GroupControl group);
	
	/**
	 * 행렬에 행을 더한다
	 * @param row 행. dsm에 추가하고 트리의 가장 마지막 노드로 넣는다
	 */
	public void
		addRow(RowControl row);
	
	/**
	 * 행을 만든다
	 * @param parent 부모 노드
	 * @param name 행의 이름
	 * @return
	 */
	public RowControl
		makeRow(String name);
	
	/**
	 * 해당 행을 삭제한다
	 * @param row 삭제할 행
	 */
	public void
		removeRow(RowControl row);
	
	/**
	 * 행을 지정 위치로 다른 행을 밑으로 밀면서 옮긴다<br/>
	 * <b>반드시 부모 노드가 같은 경우에만 이동한다</b>
	 * @param rowIndex 움직일 행의 index
	 * @param rowPosition row 행이 들어갈 위치에 잇는 행의 index. 밑으로 밀어야 한다. -1이면 맨 마지막
	 */
	public void
		moveRowTo(int rowIndex, int rowPosition)
		throws Exception;
	
	public void
		moveUp(RowControl row)
		throws Exception;
	
	public void
		moveDown(RowControl row)
		throws Exception;
	
	public void
		moveRowTo(RowControl rcMove, RowControl rcPosition, boolean bFrontof)
		throws Exception;
	
	/**
	 * row의 이름에 따라 정렬한다 <br/>
	 * 해당 그룹 한정
	 */
	public void
		sortMatrix(GroupControl gc)
		throws Exception;
	
	/**
	 * partition 연산을 수행한다
	 */
	public void
		doPartition();
	
	/**
	 * DSM객체를 가져온다
	 * @return
	 */
	public DSMControl
		getDSM();
	
	/**
	 * 2차원행렬로 바꾼다
	 * @return
	 */
	public int[][]
		getArray();
	
	/**
	 * DSM의 행 이름을 반환한다
	 * @return
	 */
	public String[]
		getNameList();
	
	/**
	 * 전체 트리를 초기화한다. newFile과 동일
	 */
	public void
		resetTree();
	
	/**
	 * from -> to의 의존성을 설정한다
	 * @param from
	 * @param to
	 * @param isDependency dependency 생성 유무
	 */
	public void
		setDependency(int from, int to, boolean isDependency);
}
